using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using MainGame.Menu;
using Services;
using MainGame.GamePlay;


namespace MainGame.StateManagement
{
  public static class StateManager
  {
    static public void StartMenu(this Game game)
    {
      game.Cleanup();
      game.Components.Add(new MenuComponent(game));
      var menu = game.Services.GetService(typeof(IMenuComponent)) as IMenuComponent;
      menu.OnPlay += () => game.StartLevel(1);
      menu.OnExit += () => game.Exit();
    }

    static private void StartLevel(this Game game, int index)
    {
      game.Cleanup();
      game.Components.Add(new InputManager(game));
      game.Components.Add(new Board(game, 10 + 2 * index, 20 + 2 * index));
      game.Components.Add(new UIRenderer(game));
      game.Components.Add(new BoardRenderer(game));
      var level_manager = game.Services.GetService(typeof(ILevelManager<Score>)) as ILevelManager<Score>;

#warning Incompleto
      /* 
       * solitamente si creano dei component aggiuntivi per la schermata di
       * vittoria e di sconfitta in cui si ricapitola il gioco, si dice il
       * punteggio in modo carino, si permette di salvare lo high-score (in
       * caso di sconfitta) e in un gioco con componenti di ruolo si permette
       * di spendere parte del punteggio guadagnato per ottenere ad es. 
       * upgrade o cose simili; non si passa diretti al menu o al livello
       * successivo
       */
      level_manager.OnLevelLost += () => game.StartMenu();
      level_manager.OnLevelWon += score => game.StartLevel(index + 1);
    }

    static private void Cleanup(this Game game)
    {
      for (int i = 0; i < game.Components.Count; i++)
      {
        (game.Components[i] as GameComponent).Dispose();
        i--;
      }
    }
  }
}
